
<?php

Yii::import('application.modules.ninio.models._base.BaseNinios');

/**
 * Modelo heredado(BaseNinio)
 */
class Ninios extends BaseNinios {

    private $niniosCarta; //atributo para asignación a un menu
    private $checkedDadosAlta; //atributo para filtrar datos
    private $nombre_completo; //atributo con referencia a los nombres completos del infante
    public $observacion_Auditoria; //guarda la observacion para las pistas de auditoria
    public $archivo_Auditoria; //guarda el archivo para la pista de auditoria

    /**
     * Recupera el nombre del modelo
     * @return Ninios
     */

    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

    /**
     * Pluraliza el nombre del modelo segun el  $n
     * @param int $n
     * @return string
     */
    public static function label($n = 1) {
        return Yii::t('app', 'Infante |Infantes', $n);
    }

    /**
     * Proporciona las relaciones combinadas para el DAO con el mismo método proveniente del BASEMODEL
     * @return array
     */
    public function relations() {
        return array_merge(parent::relations(), array(
            'infoCartaSemanls' => array(self::MANY_MANY, 'InfoCartaSemanal', 'ninios_info_cartaSemanal(ninios_id,info_carta_semanal_id)'),
        ));
    }

    /**
     * Muestra la columna que sera usada para representar la tabla
     * @return string
     */
    public static function representingColumn() {
        return 'nombre_completo';
    }

    /**
     * @Author Sofía Mejía <asmejia@utn.edu.ec>
     * function que requiere el id de un nino para retornar su nombre y apellido
     * @param in $idNinio del niño 
     * @return string con el nombre completo del niño
     */
    public function nombreCompleto($idNinio = null) {
        if (isset($idNinio) != null) {
            $ninio = Ninios::model()->findByPk((int) $idNinio);
            $var = $ninio->nombres . " " . $ninio->apellidos;
        } else {
            $var = $this->nombres . " " . $this->apellidos;
        }
        return $var;
    }

    /**
     * Modifica los nombres de las columnas de la tabla y atributos del modelo
     * @return array
     */
    public function attributeLabels() {
        return array(
            'id' => Yii::t('app', 'ID'),
            'cedula' => Yii::t('app', 'Cédula'),
            'nombres' => Yii::t('app', 'Nombres'),
            'apellidos' => Yii::t('app', 'Apellidos'),
            'genero' => Yii::t('app', 'Género'),
            'fecha_nacimiento' => Yii::t('app', 'Fecha Nacimiento'),
            'representante_cedula' => Yii::t('app', 'Cédula del Representante '),
            'representante_nombres' => Yii::t('app', ' Nombres del Representante'),
            'representante_apellidos' => Yii::t('app', 'Apellidos del Representante'),
            'telefono' => Yii::t('app', 'Teléfono'),
            'direccion' => Yii::t('app', 'Dirección'),
            'correo' => Yii::t('app', 'e-mail'),
            'fecha_ingreso' => Yii::t('app', 'Fecha Ingreso'),
            'fecha_salida' => Yii::t('app', 'Fecha Salida'),
            'institucion_id' => Yii::t('app', 'Institución'),
            'datosAntropomorficoses' => null,
            'institucion' => Yii::t('app', 'Institución'),
            'patologiases' => null,
            'checkedDadosAlta' => Yii::t('app', 'Ver Infantes Dados de Baja'),
        );
    }

    /**
     * @Author Sofía Mejía <smejia@utn.edu.ec>
     * function que busca el nombre_completo de un niño y si existe lo retorna
     * @return el nombre_completo de un niño si existe 
     */
    public function getNombre_completo() {
        if (!$this->nombre_completo)
            $this->nombre_completo = $this->nombres . ($this->nombres ? ' ' : '') . $this->apellidos;
        return $this->nombre_completo;
    }

    /**
     * Permite recuperar el ninio 
     * @param int $id del ninio seleccionado
     * @return \Ninios
     */
    public function de_ninio_id($id) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.id=:id',
                    'params' => array(
                        ':id' => $id,
                    )
                )
        );
        return $this;
    }

    /**
     * Permite recuperar los ninios de acuerdo a la institución a la que pertenece
     * @param int $id de la institucion seleccionada
     * @return \Ninios
     */
    public function de_institucion_id() {
        $modelCruge = InstitucionCrugeUser::model()->de_usuario()->findAll();
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.institucion_id=:institucion_id',
                    'params' => array(
                        ':institucion_id' => $modelCruge[0]['oldValues']['institucion_id'],
                    )
                )
        );
        return $this;
    }

    /**
     * Encuentra los ninios que no tienen hábitos alimenticios
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @return \Ninios
     */
    public function sin_habitos_alimenticios() {
        $this->getDbCriteria()->mergeWith(
                array(
                    'join' => 'LEFT JOIN patologias pa ON pa.ninios_id= t.id',
                    'condition' => 'pa.ninios_id IS NULL',
                )
        );
        return $this;
    }

    public function rules() {
        return array(
            array('cedula, nombres, apellidos, genero, fecha_nacimiento, representante_cedula, representante_nombres, representante_apellidos, telefono, direccion, correo, fecha_ingreso, institucion_id', 'required'),
            array('institucion_id', 'numerical', 'integerOnly' => true),
            array('nombres, apellidos, representante_cedula, representante_nombres, representante_apellidos, telefono, correo', 'length', 'max' => 45),
            array('direccion', 'length', 'max' => 255),
            array('genero', 'length', 'max' => 9),
            array('fecha_salida, observacion_Auditoria, archivo_Auditoria', 'safe'), //todo
            array('cedula', 'unique'),
//            array('cedula', 'numerical', 'min' => 10),
//            array('cedula', 'onlyCedula'),
            array('representante_cedula', 'numerical'),
            array('nombres', 'onlyAlfabetico'),
            array('representante_nombres', 'onlyAlfabetico'),
            array('representante_apellidos', 'onlyAlfabetico'),
            array('telefono', 'numerical'),
            array('telefono', 'length', 'max' => 10),
            array('apellidos', 'onlyAlfabetico'),
//            array('representante_cedula', 'onlyCedula'),
            array('correo', 'email'),
            array('genero', 'in', 'range' => array('FEMENINO', 'MASCULINO')), // enum,
            array('fecha_salida', 'default', 'setOnEmpty' => true, 'value' => null),
            array('id, cedula, nombres, apellidos, genero, fecha_nacimiento, '
                . 'representante_cedula, representante_nombres, representante_apellidos, '
                . 'telefono, direccion, correo,  institucion_id, checkedDadosAlta, nombre_completo', 'safe', 'on' => 'search'),
        );
    }

    /*
     * Funcion que ayuda a validar que sea solo caracter alfabetico
     * @author <mrchamorro@utn.edu.ec>
     */

    public function onlyAlfabetico($attribute, $params) {
        if (!empty($this->attributes['nombres']) && $attribute == "nombres") {
            if ($this->attributes['nombres']) {
                if (!preg_match("/^[a-zA-Zñáéíóú| ]*$/", $this->attributes['nombres'])) {
                    $this->addError($attribute, 'Este campo no acepta números o caracteres especiales');
                }
            }
        }
        if (!empty($this->attributes['apellidos']) && $attribute == "apellidos") {
            if ($this->attributes['apellidos']) {
                if (!preg_match("/^[a-zA-Zñáéíóú| ]*$/", $this->attributes['apellidos'])) {
                    $this->addError($attribute, 'Este campo no acepta números o caracteres especiales');
                }
            }
        }
        if (!empty($this->attributes['representante_apellidos']) && $attribute == "representante_apellidos") {
            if ($this->attributes['representante_apellidos']) {
                if (!preg_match("/^[a-zA-Zñáéíóú| ]*$/", $this->attributes['representante_apellidos'])) {
//                if (!preg_match("/^[a-zA-Z\s]*$/", $this->attributes['representante_apellidos'])) {
                    $this->addError($attribute, 'Este campo no acepta números o caracteres especiales');
                }
            }
        }
        if (!empty($this->attributes['representante_nombres']) && $attribute == "representante_nombres") {
            if ($this->attributes['representante_nombres']) {
                if (!preg_match("/^[a-zA-Zñáéíóú| ]*$/", $this->attributes['representante_nombres'])) {
//                if (!preg_match("/^[a-zA-Z\s]*$/", $this->attributes['representante_nombres'])) {
                    $this->addError($attribute, 'Este campo no acepta números o caracteres especiales');
                }
            }
        }
    }

    /*
     * Funcion que ayuda a validar que sea solo cedulas
     * @author <mrchamorro@utn.edu.ec>
     */

    public function onlyCedula($attribute, $params) {
        if (!empty($this->attributes['cedula']) && $attribute == "cedula") {
            if (strlen($this->attributes['cedula']) != 10) {
                $this->addError($attribute, 'Unicamente ingrese 10 números');
            } else {
                if (!Util::validarCI($this->attributes['cedula'])) {
                    $this->addError($attribute, 'Cédula incorrecta');
                }
            }
        }
        if (!empty($this->attributes['representante_cedula']) && $attribute == "representante_cedula") {
            if (strlen($this->attributes['representante_cedula']) != 10) {
                $this->addError($attribute, 'Unicamente ingrese 10 números');
            } else {
                if (!Util::validarCI($this->attributes['representante_cedula'])) {
                    $this->addError($attribute, 'Cédula incorrecta');
                }
            }
        }
    }

    public function scopes() {
        return array(
            'limitcincuenta' => array(
                'limit' => 50,
            ),
            'conFechaSalida' => array(
                'condition' => 't.fecha_salida IS NOT NULL',
            ),
            'sinFechaSalida' => array(
                'condition' => 't.fecha_salida IS NULL',
            ),
            'ordenPorNombre' => array(
                'order' => 'concat(t.nombres) asc',
            ),
        );
    }

    /**
     * Busca si la tabla del modelo no esta vacia
     * @author Sofia Mejia <asmejia@utn.edu.ec>
     * @return query
     */
    public function contarDatos() {
        $command = Yii::app()->db->createCommand()
                ->select("count(id) as total")
                ->from($this->tableName());
        $result = $command->queryAll();
        return $result[0]['total'];
    }

    public function search() {
        $criteria = new CDbCriteria;
        $sort = new CSort;
        $criteria->compare('id', $this->id);
        $criteria->compare('cedula', $this->cedula, true);
        $criteria->compare('nombres', $this->nombres, true);
        $criteria->compare('apellidos', $this->apellidos, true);
        $criteria->compare('genero', $this->genero, true);
//        $criteria->compare('fecha_nacimiento', $this->fecha_nacimiento, true);
        $criteria->compare('representante_cedula', $this->representante_cedula, true);
//        $criteria->compare('representante_nombres', $this->representante_nombres, true);
//        $criteria->compare('representante_apellidos', $this->representante_apellidos, true);
//        $criteria->compare('telefono', $this->telefono, true);
//        $criteria->compare('direccion', $this->direccion, true);
//        $criteria->compare('correo', $this->correo, true);
//        $criteria->compare('fecha_ingreso', $this->fecha_ingreso, true);
//        $criteria->compare('fecha_salida', $this->fecha_salida, true);
        $criteria->compare('institucion_id', $this->institucion_id, false);
//        if (isset($_GET['dropDownStatus']) && $_GET['dropDownStatus'] != 'empty') {
//            $criteria->params = array(':institucion_id' => $_GET['dropDownStatus']);
//            $criteria->condition = 't.institucion_id= :institucion_id';
//        }
//        var_dump($criteria);
//        die();
        $sort->defaultOrder = 'concat(t.nombres," ",t.apellidos) asc';
        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

    /**
     * Encuentra los ninios que no tienen patologias
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @return \ninios
     */
    public function sin_patologias() {
        $this->getDbCriteria()->mergeWith(
                array(
                    'join' => 'LEFT JOIN patologias pa ON pa.ninios_id= t.id',
                    'condition' => 'pa.ninios_id IS NULL',
                )
        );

        return $this;
    }

    /**
     * Busca si los infantes tienen fecha de salida
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @return \Ninios
     */
    public function sin_FechaSalida() {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.fecha_salida IS NULL',
                )
        );
        return $this;
    }

    /**
     * Busca los infantes con fecha de salida
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @return \Ninios
     */
    public function con_FechaSalida() {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.fecha_salida IS Not NULL',
                )
        );
        return $this;
    }

    public function behaviors() {
        return array(
            'ActiveRecordLogableBehavior' => array('class' =>
                'application.behaviors.NiniosActiveRecordLogableBehavior'),
        );
    }

}
